package com.mpo.ejb.servicio.frontend.impl;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;

import javax.ejb.EJB;
import javax.ejb.Remote;
import javax.ejb.Stateless;
import javax.ejb.TransactionAttribute;
import javax.ejb.TransactionAttributeType;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.mpo.common.util.ConstantesApplication;
import com.mpo.common.util.SeguridadesException;
import com.mpo.common.util.UtilAplication;
import com.mpo.ejb.persistence.dao.frontend.impl.EmpresaDAO;
import com.mpo.ejb.persistence.dao.frontend.impl.ClienteDAO;
import com.mpo.ejb.persistence.dao.frontend.impl.CuentaDAO;
import com.mpo.ejb.persistence.dao.frontend.impl.DetalleCuentaDAO;
import com.mpo.ejb.persistence.dao.frontend.impl.OrdenDePagoDAO;
import com.mpo.ejb.persistence.dao.frontend.impl.PersonaDAO;
import com.mpo.ejb.persistence.dao.frontend.impl.ServicioDAO;
import com.mpo.ejb.persistence.dao.frontend.impl.TipoDetalleCuentaDAO;
import com.mpo.ejb.persistence.util.frontend.dto.OrdenDePagoDTO;
import com.mpo.ejb.persistence.util.frontend.dto.UsuarioDTO;
import com.mpo.ejb.servicio.frontend.ServicioClienteRemote;
import com.mpo.ejb.persistence.dao.frontend.impl.HistorialCuentaPersonaDAO;
import com.mpo.ejb.persistence.entities.Cuenta;
import com.mpo.ejb.persistence.entities.DetalleCuenta;
import com.mpo.ejb.persistence.entities.Empresa;
import com.mpo.ejb.persistence.entities.HistorialCuentaPersona;
import com.mpo.ejb.persistence.entities.OrdenDePago;
import com.mpo.ejb.persistence.entities.Persona;
import com.mpo.ejb.persistence.entities.Servicio;
import com.mpo.ejb.persistence.entities.TipoDetalleCuenta;
import com.mpo.ejb.persistence.entities.Usuario;

/**
 * Session Bean implementation class ServicioCliente
 */
@Stateless
@Remote(ServicioClienteRemote.class)
public class ServicioClienteImpl implements ServicioClienteRemote {
	private static final Logger log = LoggerFactory
			.getLogger(ServicioClienteImpl.class);
	@EJB
	private ClienteDAO clienteDAO;
	@EJB
	private CuentaDAO cuentaDAO;
	@EJB
	private PersonaDAO PDAO;
	@EJB
	private HistorialCuentaPersonaDAO historialCuentaPersonaDAO;
	@EJB
	private DetalleCuentaDAO detalleCuentaDAO;
	@EJB
	private TipoDetalleCuentaDAO tipoDetalleCuentaDAO;
	@EJB
	private ServicioDAO servicioDAO;
	@EJB
	private EmpresaDAO empresaDAO;
	
	@EJB
	private OrdenDePagoDAO ordenDePagoDAO;
    
	private Cuenta cuenta;
	private HistorialCuentaPersona historialCuentaPersona;
	private TipoDetalleCuenta tipoDetalleCuenta;
	private DetalleCuenta detalleCuenta;
	private Servicio servicio;
	private Usuario usuario;
	private Persona persona;

	private boolean transaccionRealizada;

	// private Campania campaniasE;
	/**
	 * Default constructor.
	 */
	public ServicioClienteImpl() {
		// TODO Auto-generated constructor stub
	}

	@Override
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public boolean setPasajero(String nombres, String apellidos,
			String pasaporte, String email, String pais)
			throws SeguridadesException {
		log.info("metodo setPasajero session bean");
		System.out.println("Pasaporte = " + pasaporte);
		clienteDAO.setPasajeros(nombres, apellidos, pasaporte, email, pais);
		// Cache manager = EHCacheManager.getCache();
		// if (!manager.isElementInMemory(ConstantesCache.CacheTecnologias)) {
		// ArrayList<CampaniaDTO> campanias = new ArrayList<CampaniaDTO>();
		// campaniasE= campaniaDAO.buscarPorId(idCampania);
		// System.out.println("Nombre de la Campania :"+campaniasE.getNombreCampania());
		// campaniaDTO.idCampania=campaniasE.getIdCampania();
		// campaniaDTO.nombreCampania=campaniasE.getNombreCampania();
		// campaniaDTOs.add(campaniaDTO);
		// return (List<CampaniaDTO>) campaniaDTOs;
		return true;
	}

	/**
	 * Metodo que permite abrir una cuenta para el clienta que ha fonfirmado su
	 * reserva
	 */
	@Override
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public boolean setAbrirCuentaCliente(Integer cliente,
			String descripcionCuenta) throws SeguridadesException {
		log.info("metodo setAbrirCuentaCliente session Bean ServicioClienteImpl");
		transaccionRealizada = false;
		try {

			this.cuenta = new Cuenta();
			this.historialCuentaPersona = new HistorialCuentaPersona();
			this.cuenta.setDescCuenta(descripcionCuenta);
			this.cuenta.setEstado(ConstantesApplication.ESTADO_ACTIVO);
			this.cuentaDAO.guardar(this.cuenta);
			this.historialCuentaPersona.setCuenta(this.cuenta);
			this.historialCuentaPersona.setPersona(this.clienteDAO
					.buscarPorId(cliente));
			this.historialCuentaPersona.setEstatuscuenta(Integer
					.parseInt(this.cuenta.getEstado()));
			this.historialCuentaPersonaDAO.guardar(this.historialCuentaPersona);
			transaccionRealizada = true;
		} catch (Exception e) {
			log.info("Error al abrir cuenta de cliente", e.getMessage());
			throw new SeguridadesException(
					"No se pudo insertar datos de la nueva cuenta a ralizar");
		}
		return transaccionRealizada;
	}

	/**
	 * Metodo que permite registrar nuevos servicios al cliente
	 */
	@Override
	@TransactionAttribute(TransactionAttributeType.REQUIRED)
	public boolean setServiciosCliente(Integer cuenta, Integer servicio,
			Integer cantidad, String detalle) throws SeguridadesException {
		log.info("metodo setServiciosCliente session Bean ServicioClienteImpl");
		transaccionRealizada = false;
		try {
			this.historialCuentaPersona = new HistorialCuentaPersona();
			this.detalleCuenta = new DetalleCuenta();

			this.detalleCuenta.setTipoDetalleCuenta(this.tipoDetalleCuentaDAO
					.buscarPorId(Integer
							.parseInt(ConstantesApplication.ASIENTO_CARGO)));

			this.historialCuentaPersona.setEstatuscuenta(Integer
					.parseInt(this.cuentaDAO.buscarPorId(cuenta).getEstado()));

			this.detalleCuenta.setCuenta(this.cuentaDAO.buscarPorId(cuenta));

			this.servicio = this.servicioDAO.buscarPorId(servicio);

			this.detalleCuenta.setConcepto(this.servicio.getNombreServicio()
					+ " :" + detalle);

			this.detalleCuenta.setPrecioUnitario(this.servicio.getPrecio());
			log.info("metodo:");
			this.detalleCuenta.setCantidad(cantidad);

			this.detalleCuentaDAO.guardar(this.detalleCuenta);

		} catch (Exception e) {
			log.info("Error al abrir cuenta de cliente", e.getMessage());
			throw new SeguridadesException(
					"No se pudo insertar datos de la nueva cuenta a ralizar");
		}
		return transaccionRealizada;
	}

	/**
	 * Metodo que permite obtener enpleados por el id de la empresa
	 */
	@Override
	public List<UsuarioDTO> getEmpleadosPorIdEmpresa(Integer idEmpresaMain)
			throws SeguridadesException {
		log.info("metodo getEmpleadosPorIdEmpresa session Bean ServicioClienteImpl");
		List<UsuarioDTO> empleados = new ArrayList<UsuarioDTO>();

		List<Persona> personas = null;
		try {
			personas = this.clienteDAO
					.buscarPersonasPorIdEmpresa(this.empresaDAO
							.buscarPorId(idEmpresaMain));

			for (Persona persona : personas) {
				UsuarioDTO empleado = new UsuarioDTO();
				empleado.setIdEmpresa(persona.getEmpresa().getIdEmpresa());
				empleado.setIdPersona(persona.getIdPersona());
				empleado.setApellidos(persona.getApellidos());
				empleado.setNombres(persona.getNombres());

				empleados.add(empleado);

			}

		} catch (Exception e) {
			log.info("Error al obtener empleados de la empresa", e.getMessage());
			throw new SeguridadesException(
					"No se ha podido obtener los empleados de la empresa");
		}
		return empleados;

	}

	@Override
	public boolean setOrdenPagoPorIdCuenta(Integer cuenta, String fechaInicio,
			String fechaLimite, String valor, String concepto)
			throws SeguridadesException {

		return true;
	}
	@Override
	public OrdenDePagoDTO getOrdenPagoPorId(Integer idOrdenPago)throws SeguridadesException
	{
		log.info("metodo getEmpleadosPorIdEmpresagetOrdenPagoPorId session Bean ServicioClienteImpl");
		OrdenDePago ordenDePago = new OrdenDePago();
		OrdenDePagoDTO ordenDePagoDTO = new OrdenDePagoDTO();
		try {
			
			ordenDePago = this.ordenDePagoDAO.buscarPorId(idOrdenPago);
			ordenDePagoDTO.setIdOrdenDePago(ordenDePago.getIdOrdenPago());
			ordenDePagoDTO.setIdCuenta(ordenDePago.getCuenta().getIdCuenta());
			ordenDePagoDTO.setFechaInicio(null);
			ordenDePagoDTO.setFechaInicio(null);
			ordenDePagoDTO.setValor(null);
			ordenDePagoDTO.setEstado(null);	
			

		} catch (Exception e) {
			log.info("Error al obtener orden de pago", e.getMessage());
			throw new SeguridadesException(
					"No se ha podido obtener orden de pago ");
		}
		return ordenDePagoDTO;
		
		}
	/*
	 * LoginVO loginVOUsuario = null;
	 * 
	 * try {
	 * 
	 * CredencialesDTO credencialesDTO = loginVO.getCredencialesDTO();
	 * 
	 * // slf4jLogger.info("credencialesDTO.getPassword {}",
	 * credencialesDTO.getPassword()); //String claveEncriptada =
	 * EncriptacionUtil.getInstancia().encriptar(credencialesDTO.getPassword());
	 * String claveEncriptada=credencialesDTO.getPassword(); //
	 * slf4jLogger.info("claveEncriptada {}", claveEncriptada);
	 * credencialesDTO.setPassword(claveEncriptada);
	 */
}
